package com.hgx.su.common.springboot.web.util;

import com.hgx.su.common.pure.constants.GeneralConstant;
import com.hgx.su.common.pure.exception.AppException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.util.Properties;


public class AppExceptionUtil {

    private static Logger log = LoggerFactory.getLogger(AppExceptionUtil.class);

    //local error文件地址
    private static final String ERROR_PRO_PATH = "appConf/error.properties";
    public static Properties ERROR_PRO = new Properties();
    private static String moduleCode;
    private static String moduleName;

    /**
     * 默认异常信息抛出
     *
     * @return 返回参数
     */
    public static AppException exception() {
        AppException appException = new AppException(getModuleCode(), GeneralConstant.SERVICE_EXCEPTION_CODE, GeneralConstant.SERVICE_EXCEPTION);
        appException.setModuleName(moduleName);
        return appException;
    }

    /**
     * 异常信息抛出 通过code直接读取配置异常消息
     *
     * @param code 异常编号
     * @return 异常信息抛出
     */
    public static AppException exception(String code) {
        if (StringUtils.isEmpty(code)) {
            return exception();
        }
        AppException appException = new AppException(getModuleCode(), code, getErrorString(code));
        appException.setModuleName(moduleName);
        return appException;
    }

    /**
     * 可填充异常信息抛出
     * 如 code=订单号%s不存在 args=10001 输出消息为 订单号10001不存在
     *
     * @param code 配置code
     * @param args 填充参数
     * @return 异常信息抛出
     */
    public static AppException exception(String code, Object... args) {
        if (StringUtils.isEmpty(code)) {
            return exception();
        }

        AppException appException = new AppException(getModuleCode(), code, String.format(getErrorString(code), args));
        appException.setModuleName(moduleName);
        return appException;
    }

    /**
     * 自定义异常信息抛出
     *
     * @param code    编号
     * @param message 自定义消息
     * @return 异常信息抛出
     */
    public static AppException CustomException(String code, String message) {
        AppException appException = new AppException(getModuleCode(), code, message);
        appException.setModuleName(moduleName);
        return appException;

    }


    public static String getModuleCode() {
        if (moduleCode == null && !initErrorException()) {
            log.error(">>>>>_无法获得系统系统模块定义，请检查error.properties 是否加载");
        }
        return moduleCode;
    }

    /**
     * 初始化此类的时候必须要 @Title: initErrorException @Description:
     */
    public static synchronized boolean initErrorException() {
        //本地
        // 从class path 中获得配置文件
        ClassPathResource cr = new ClassPathResource(ERROR_PRO_PATH);
        try {
            ERROR_PRO.load(cr.getInputStream());
            // 解析出配置文件中的sysCode 设置Module
            moduleCode = ERROR_PRO.getProperty("moduleCode");
            moduleName = ERROR_PRO.getProperty("moduleName");
            if (moduleCode == null) {
                throw new Exception("不能从配置文件中解析出系统编码");
            }
            return true;
        } catch (IOException ex) {
            log.error("从本地获取错误文件IOException异常", ex);
        } catch (Exception e) {
            log.error("从本地获取错误文件Exception异常", e);
        }

        return moduleCode != null;
    }

    public static String getErrorString(String code) {
        return ERROR_PRO.getProperty(code, GeneralConstant.SERVICE_EXCEPTION);
    }

}